// 导入学生模型
import { Student } from "../model/student.js";
// 导入依赖包
import url from "url";
// 导入时间依赖包
import moment from "moment";

// 创建函数（查询所有学生）
async function students(ctx, next) {
  // 判断当前页面访问路径 是否正确
  if (ctx.url === "/student/") {
    // 重定向回首页
    ctx.redirect(`/student`);
  }

  // 判断学生是否存在
  const students = await Student.findAll();

  // 存储学生对象列表
  const arr = [];

  // 遍历学生对象 并 给学生列表添加学生对象
  students.forEach((student) => {
    // 拿到学生对象
    const obj = student.dataValues;
    // 校验时间格式
    obj.enrollmentTime = moment(obj.enrollmentTime).format(
      "YYYY-MM-DD HH:mm:ss"
    );
    // 添加对象 到学生列表
    arr.push(obj);
  });

  // 拿到 页码 和 每页展示数
  const queryUrl = url.parse(ctx.url, true).query;
  // 默认的页码
  const page = parseInt(queryUrl.page) || 1;
  // 默认的每页展示数
  const limit = parseInt(queryUrl.limit) || 10;

  // 用于分页返回对象列表
  let newArr;

  // 总页数计算需要确保limit不是0以避免除以0的情况
  const totalPages = limit !== 0 ? Math.ceil(arr.length / limit) : 0;

  // 判断页面 大于 0 并且 不会大于总页码
  if (page > 0 && page <= totalPages) {
    // 起始索引
    const nowIndex = (page - 1) * limit;
    // 结尾索引
    const maxIndex = Math.min(nowIndex + limit, arr.length);
    // 选取范围内的学生到新对象列表
    newArr = arr.slice(nowIndex, maxIndex);
  } else {
    // 重定向回首页
    ctx.redirect(`/student`);
  }

  // 把学生信息进行渲染 然后再响应给浏览器
  ctx.render("students.html", { students: newArr });
}

// 创建函数（用 id 查询 一个 学生）
async function studentById(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 判断学生是否存在
  const student = await Student.findByPk(id);

  // 判断是否有查询到信息
  if (!student) {
    console.log("未查到学生！");
  } else {
    // 成功状态码
    ctx.status = 200;
    // 拿到学生对象
    const obj = student.dataValues;
    // 校验时间格式
    obj.enrollmentTime = moment(obj.enrollmentTime).format(
      "YYYY-MM-DD HH:mm:ss"
    );
    // 渲染并响应页面给浏览器
    ctx.render("updateStudent.html", { student: obj });
  }
}

// 创建函数（添加 一个 学生）
async function insertStudent(ctx, next) {
  // 拿到要添加的学生对象
  const studentObj = ctx.request.body;

  // 把对象给学生模型 进行新增
  await Student.create(studentObj);

  // 添加成功提示
  ctx.status = 200;
  ctx.body = "学生添加成功";
}

// 创建函数（修改 一个 学生信息）
async function updateStudent(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 拿到学生信息
  const studentObj = ctx.request.body;

  // 修改学生信息
  await Student.update(studentObj, { where: { id } });

  // 修改成功提示
  ctx.status = 200;
  ctx.body = "学生修改成功";
}

// 创建函数（删除 一个 学生）
async function deleteStudent(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 判断学生是否存在
  const studentExists = await Student.findByPk(id);

  // 如果不存在就控制台提示
  if (!studentExists) {
    ctx.body = "学生不存在";
    // 设置状态码为404表示资源未找到
    ctx.status = 404;
  } else {
    // 删除学生
    await Student.destroy({ where: { id } });

    // 删除成功提示
    ctx.status = 200;
    ctx.body = "学生删除成功";
  }
}

// 暴露 api 函数接口
export const obj = {
  "get /student": students,
  "get /student/:id": studentById,
  "post /student": insertStudent,
  "put /student/:id": updateStudent,
  "delete /student/:id": deleteStudent,
};
